package UDP.file;

import java.io.File;
import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

//发送文件

/**
 * 1.创建udp套接字
 * 2.把文件变成二进制流
 * 3.创建空的包去存放文件的二进制流
 * 4.发送包（需要对方的IP，端口）
 * <p>
 * UDP提供了无连接通信，且不对传送数据包进行可靠性保证，适合于一次传输少量数据，UDP传输的可靠性由应用层负责.
 * 应为传输数据少所以要尽可能的每次发送数据的字节数少一些所以
 * 对文件进行分片，然后再传输：。一般一个片8-16字节传输的比较保险，但是这样其实效率是很低的，因为IP数据包头就至少有20字节
 * （在千兆局域网的条件下，做了个实验平均10万个包，丢那么几十个，大约万分之几的概率）
 * 在32字节以上时，基本上会传输失败。而且如果是传音乐、图片的话还好，我试着传了一个10M的rar，用了5分钟，
 * 而且有一些损坏，rar里面的部分文件不能看了。
 */
public class file_send extends Thread {
    private DatagramSocket socket = null;//套接字
    private DatagramPacket packet = null;//包
    private FileInputStream file = null;//文件流
    private InetAddress ip = null;//ip
    private int post;//端口

    /**
     * 通过构造方法获取ip和端口
     *
     * @param ip
     * @param post
     */
    public file_send(InetAddress ip, int post) {
        this.ip = ip;
        this.post = post;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket();
            file = new FileInputStream(new File("C:\\Users\\qjw\\Pictures\\Camera Roll\\2019-08-28 192724.jpg"));//文件流
            byte[] wj =new byte[8];//空的字节
            while (true){
                if (file.read(wj)!=-1){
                    //file.read(wj) 从该输入流读取一个字节的数据。 如果没有输入可用，此方法将阻止。 如果没有返回-1
                    packet=new DatagramPacket(wj,0,wj.length,ip,post);//创建包，并向其中放入数据
                    socket.send(packet);//发送包
                }else {
                    String js = "发送";
                    System.out.println("文件发送完成");
                    packet = new DatagramPacket(js.getBytes(),0,js.getBytes().length,ip,post);
                    socket.send(packet);
                    socket.close();
                    break;
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
